package cola;

import static org.junit.Assert.*;
import org.junit.*;

public class QueueTest {

	private IQueue queue;
	private IQueue empty_queue;

	/* Inicialización de las pruebas */

	@Before
	public void setUpClass() {
		queue = new Queue();
		empty_queue = new Queue();
	}

	/* Prueba de Size */
	@Test
	public void testSize() {
		queue.enqueue(4);
		// 1 Elemento
		assertEquals(1, queue.size());
		// Varios elementos
		queue.enqueue(3);
		queue.enqueue(2);
		queue.enqueue(1);
		assertEquals(4, queue.size());

	}

	/* Prueba de Empty */
	@Test
	public void testEmpty() {
		// Ningun Elemento
		assertTrue(empty_queue.empty());
		// Varios Elementos
		queue.enqueue(4);
		assertFalse(queue.empty());
	}

	/* Prueba de Clear */
	@Test
	public void testClear() {
		// Ningun Elemento
		queue.clear();
		assertEquals(0, queue.size());
		// Varios Elementos
		queue.enqueue(1);
		queue.enqueue(2);
		queue.enqueue(3);
		queue.clear();
		assertEquals(0, queue.size());
	}

	/* Prueba de Encolar: Probar el valor devuelto y el nuevo tamaño */
	@Test
	public void testEnqueue() {
		// Lista Vacia
		queue.clear();
		queue.enqueue(1);
		assertEquals(1, queue.size());
		// Lista 1 Elemento
		queue.enqueue(8);
		assertEquals(2, queue.size());
		// Lista Varios Elementos
		queue.enqueue(10);
		assertEquals(3, queue.size());

	}

	/* Prueba de Desencolar: Probar el valor devuelto y el nuevo tamaño */
	@Test
	public void testDequeue() throws EmptyQueueException {
		// Lista 1 Elemento
		queue.enqueue(1);
		assertEquals(1, queue.dequeue());
		assertEquals(0, queue.size());
		// Lista Varios Elementos
		queue.enqueue(1);
		queue.enqueue(2);
		queue.enqueue(3);
		queue.enqueue(4);
		queue.enqueue(5);
		assertEquals(1, queue.dequeue());
		assertEquals(4, queue.size());
	}

	/*
	 * Prueba de Desencolar vacío: Limpiar y desencolar para que salte la
	 * excepción
	 */
	@Test(expected = EmptyQueueException.class)
	public void testEmptyDequeue() throws EmptyQueueException {
		// Lista Vacia
		queue.dequeue();
	}

	/* Prueba de Front vacío: Limpiar y desencolar para que salte la excepción */
	@Test(expected = EmptyQueueException.class)
	public void testFrontEmpty() throws EmptyQueueException {
		// Lista Vacia
		queue.front();
	}
}